package utils

import (
	"math"
	"reflect"
)

// IsContain 判断元素是否存在数组list中  注意参数中 array 与 value 类型需要一致
func IsContain(array interface{}, value interface{}) bool {
	switch reflect.TypeOf(array).Kind() {
	case reflect.Slice:
		s := reflect.ValueOf(array)
		for i := 0; i < s.Len(); i++ {
			if reflect.DeepEqual(value, s.Index(i).Interface()) {
				return true
			}
		}
	}
	return false
}

// Min 最小值
func Min(nums ...float64) float64 {
	arrLen := len(nums)

	if arrLen == 0 {
		return 0
	}

	if arrLen == 1 {
		return nums[0]
	}

	min := nums[0]
	for i := 1; i < len(nums); i++ {
		min = math.Min(min, nums[i])
	}
	return min
}

// Max 最大值
func Max(nums ...float64) float64 {
	arrLen := len(nums)

	if arrLen == 0 {
		return 0
	}

	if arrLen == 1 {
		return nums[0]
	}

	min := nums[0]
	for i := 1; i < len(nums); i++ {
		min = math.Max(min, nums[i])
	}
	return min
}

// IF 三元运算符
func IF[T any](condition bool, trueVal T, falseVal T) T {
	if condition {
		return trueVal
	}
	return falseVal
}

// Intersect 数组交集
func Intersect[T comparable](a, b []T) []T {
	m := make(map[T]bool)
	n := make([]T, 0)

	// 将切片a的元素设置为map的key
	for _, v := range a {
		m[v] = true
	}

	// 遍历切片b，如果元素在map中存在，则加入结果切片
	for _, v := range b {
		if m[v] {
			n = append(n, v)
		}
	}

	return n
}

// SliceUnique 切片 去重
func SliceUnique[T comparable](slice []T) []T {
	// 使用map来存储已经出现过的元素
	elements := make(map[T]bool)
	var result []T

	for _, v := range slice {
		if _, ok := elements[v]; !ok {
			// 如果元素没有出现过，添加到结果切片中
			result = append(result, v)
			// 将元素标记为已出现
			elements[v] = true
		}
	}

	return result
}
